# -*- coding: utf-8 -*-
# 按照不同的功能流程输出不同的日志文件,process_tag作为区分标志

from loguru import logger
from datetime import datetime
import json


def time_flag():
    return f'{datetime.now():%H:%M:%S.%f}|>'


# 定义日志等级，可以后续配置修改，合理设定日志输出
with open('./config/logcfg.json', 'r') as f:
    config_log = json.load(f)
level_dict = config_log['level']

# 定义日志格式
step_logger_format = "{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | {extra[process_tag]} | {module}::{function}::{line} | {message}"


# 定义不同功能模块的日志对象
uds_handle_logger = logger.bind(process_tag="uds_handle")
functest_can_can_logger = logger.bind(process_tag="functest_can_can")
functest_uds_uds_logger = logger.bind(process_tag="functest_uds_uds")
functest_uds_can_logger = logger.bind(process_tag="functest_uds_can")

# 移除默认的控制台处理器
logger.remove()

# 配置不同日志对象的输出文件
logger.add(
    "./logs/uds_handle.log",
    rotation="1 MB",
    retention=5,
    format=step_logger_format,
    level=level_dict['uds_handle'],
    filter=lambda record: record["extra"].get(
        "process_tag") == "uds_handle"
)

logger.add(
    "./logs/functest_can_can.log",
    rotation="1 MB",
    retention=5,
    format=step_logger_format,
    level=level_dict['functest_can_can'],
    filter=lambda record: record["extra"].get(
        "process_tag") == "functest_can_can"
)

logger.add(
    "./logs/functest_uds_uds.log",
    rotation="1 MB",
    retention=5,
    format=step_logger_format,
    level=level_dict['functest_uds_uds'],
    filter=lambda record: record["extra"].get(
        "process_tag") == "functest_uds_uds"
)

logger.add(
    "./logs/functest_uds_can.log",
    rotation="1 MB",
    retention=5,
    format=step_logger_format,
    level=level_dict['functest_uds_can'],
    filter=lambda record: record["extra"].get(
        "process_tag") == "functest_uds_can"
)

# 以下设置可以将有an的日志忽略掉
# 示例：自定义过滤函数

'''
def filter_an(record):
    return "an" not in record["message"]


logger.add(
    sink=lambda msg: None,  # 丢弃符合条件的日志
    filter=lambda record: not filter_an(record)
)

'''

# 移除默认的控制台处理器
# logger.remove()

# # 添加新的控制台处理器
# logger.add(
#     sink="stdout",
#     format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | {extra[process_tag]} | {message}",
#     level="DEBUG"
# )

if __name__ == "__main__":
    if 1:
        for i in range(3):
            functest_can_can_logger.debug("这是 functest_can_can 的 debug日志输出")
            functest_can_can_logger.info("这是functest_can_can的 info日志输出")
            functest_can_can_logger.warning("这是functest_can_can的 warn日志输出")
            functest_can_can_logger.error("这是functest_can_can的 error日志输出")

            uds_handle_logger.debug("这是functest_logger的 debug日志输出")
            uds_handle_logger.info("这是functest_logger的 info日志输出")
            uds_handle_logger.warning(" 这是functest_logger的 warn日志输出")
            uds_handle_logger.error("这是functest_logger的 error日志输出")

            functest_uds_uds_logger.debug(
                "这是functest_uds_uds_logger的 debug日志输出")
            functest_uds_uds_logger.info(
                "这是 functest_uds_uds_logger 的 info日志输出")
            functest_uds_uds_logger.warning(
                "这是functest_uds_uds_logger的 warn日志输出")
            functest_uds_uds_logger.error(
                "这是functest_uds_uds_logger的 error日志输出")

            functest_uds_can_logger.debug(
                "这是functest_uds_can_logger的 debug日志输出")
            functest_uds_can_logger.info(
                "这是 functest_uds_can_logger 的 info日志输出")
            functest_uds_can_logger.warning(
                "这是functest_uds_can_logger的 warn日志输出")
            functest_uds_can_logger.error(
                "这是functest_uds_can_logger的 error日志输出")
